
#ifndef I_EXCEPCIONES_H_
#define I_EXCEPCIONES_H_

#include <exception> 
#include <fstream>
#include <sstream>
#include <iostream>

class LecturaException : public std::exception {
   public:
      virtual const char * what() const throw() = 0;
      virtual ~LecturaException() throw() { }
};

class NoExisteElArchivo : public LecturaException {
   public:
      virtual const char* what() const throw() {
         return "No se ha podido abrir el archivo. Por favor verifique que exista y que tenga permisos de lectura.";
      }

      virtual ~NoExisteElArchivo() throw() {}
};

/* Excepcion asociada el error de obtener datos validos
 * desde un archivo (o stream) durante la lectura de la 
 * cabecera de dicho archivo.
 * */
class LecturaCabeceraException : public LecturaException {
   private:
      const LecturaCabeceraException& operator=(
            const LecturaCabeceraException &aCopiar);

   public:
      virtual const char* what() const throw() {
         return "Ha ocurrido un error durante la lectura de la cabecera del archivo.";
      }

      virtual ~LecturaCabeceraException() throw() {}
};

/* Excepcion asociada el error de obtener datos validos
 * desde un archivo (o stream) durante la lectura de las
 * definiciones de las esferas.
 * */
class LecturaEsferaException : public LecturaException {
   private:
      const bool finDeArchivo;
      const unsigned int numEsfera;

      const LecturaEsferaException& operator=(
            const LecturaEsferaException &aCopiar);

   public:
      LecturaEsferaException(bool finDeArchivo, unsigned int numEsfera) : 
         finDeArchivo(finDeArchivo),
         numEsfera(numEsfera) {}

      virtual const char* what() const throw(){
         std::ostringstream msg;
         
         msg << "Ha ocurrido un error durante la lectura de las esferas." << std::endl;

         if(finDeArchivo){
            msg << "Se alcanzo el Fin de Archivo en el medio de la lectura, en un lugar no esperado.";
         } else {
            msg << "Se produjo un error en la sintaxis.";
         } 

         msg << std::endl << "El error esta en la esfera numero " << numEsfera << "." << std::endl;

         return msg.str().c_str();
      }

      virtual ~LecturaEsferaException() throw() {}
};

#endif
